Structured Query Language(SQL)常使用於 database 系統中,包括 Microsoft SQL server、Oracle、MySQL、Microsoft Access等,透過 SQL 語法對於資料的儲存、擷取、連結、備份等等皆十分方便,常見使用於倉管、電子商務系統等。然而在 SQL 語法中常會出現攻擊者可以透過更改語法邏輯或加入特殊指令的方式,在未設定過濾惡意程式碼的情況下,資料庫伺服器(DataBase)會直接接收使用者所輸入的 SQL 指令並執行攻擊代碼,使攻擊者能夠取得最高權限,得以擅自竊取、修改、挪動或刪除資料的可能。此類漏洞無疑的會對公司或商號造成相當大的損傷。
舉例而言:
若今天我們透過 ASP 語法去組成 SQL Query statement 以供訪問者作產品查詢,範例語法如下
sql_query = "SELECT ProductName, ProductDescription FROM Products WHERE ProductNumber = " & Request.QueryString("ProductID")
其中 SELECT ProductName, ProductDescription FROM Products 表示從 Products
列表(Table)中列舉出 產品名稱(ProductName)與產品描述(ProductDescription)兩個 Columns 的內容。
而 WHERE ProductNumber = " & Request.QueryString("ProductID") 則是當產品編號(ProductNumber)會從取值並列出符合該值的 ProductName 與 ProductDescription。
其中 & Request.QueryString("ProductID")
是 ASP 語法,取值後接到 ProductNumber =
後面。
屬於一種相當常見的 SQL Query statement。
範例 URL 如下:
http://www.mydomain.com/products/products.asp?productid=123
假設擷取產品編號為 123
的產品,則上面的 Query statement 將會變成
SELECT ProductName, ProductDescription FROM Products WHERE ProductNumber = 123
以列出產品編號為 123
之產品名稱及描述。
但若是將網址改為
http://www.mydomain.com/products/products.asp?productid=123 or 1=1
由於條件式 1=1 恆正,則會讓 Products
Table 中所有的產品名稱及描述通通都列出來。
以上的範例僅僅是列出產品清單,其實較無傷大雅。以下將整理三種較常見的 SQL injection 攻擊手法。
三種較常見的 SQL injection 攻擊手法:
1. Authorization Bypass:
與上面範例的內容相似,假設今天有一段 Query statement 要求使用者輸入帳號及密碼,如下。
"SELECT * FROM customers WHERE name =' -name- ' AND password = ' -password-'
statment 中有兩個 input 值 name
與 password
,會有兩個可供使用者輸入值的方塊,但是有心的攻擊者當然不會乖乖的輸入帳號及密碼囉!!透過在' -name- '所對應的方塊內輸入
'OR 1=1 --
其中
語法 | 意義 |
---|---|
' | 是將 name 的 input 方塊內容關閉 |
OR | 是指或是 的條件 |
1=1 | 恆正 |
-- | 將後方接著的內容註解化 |
會使得 Query statement 變為
"SELECT * FROM customers WHERE name =''OR 1=1
2. Injecting SQL Sub-Statements into SQL Queries:
攻擊者可以在注入惡意的 SQL 的語法去改變資料庫,如在本文一開始的範例中,加入一段 malicious commands
http://www.mydomain.com/products/products.asp?productid=123; DROP TABLE Products
在上面的 URL 中在 productid=123
後面加上一個分號 ;
,並加上 DROP TABLE Products
這個 sub command會命令 SQL server 將 Products 這個 Table 刪除掉。
或是進一步去探索其他 table 中的資料,如下方的 SQL Query:
http://www.mydomain.com/products/products.asp?productid=123 UNION SELECT Username, Password FROM USERS
其中 UNION
能將兩個 SELECT
的結果用一個結果集呈現出來,而第二個 SELECT
是將 USERS
這個 Table 的 Username
與 Password
呈現出來,以竊取資料庫中存放的所有使用者的帳號密碼,有沒有很可怕呀!!
3. Exploiting Stored Procedures:
Stored Procedures(預存程序)是將又臭又長又常用的 SQL 語法寫成一組程序並儲存起來,以供後續呼叫相同程序時不必再將完整個 SQL 語法重打一次,攻擊者亦可透過呼叫這些 Stored Procedures 進而對 DataBase 進行攻擊,如下:
SomeAsp.asp?city=pune';EXEC master.dbo.xp_cmdshell' cmd.exe dir c:
透過 EXEC 去執行 master.dbo.xp_cmdshell
這個預存程序,並帶一參數 cmd.exe dir c:
代表想讓預存程序執行的內容。
想想看,若是攻擊者在某一天將某些公司資料庫中某項產品的價格調為 0 元,竄改政府機關資料庫報稅資料或是將某大廠物料庫存清單刪除,這損失會有多慘重。
如何防範:
希望有興趣的讀者也能夠點個追蹤,有任何問題或有想多了解的地方也可以回覆在文章底下唷,謝謝你們XDDDD!
參考來源:
Microsoft MSDN https://msdn.microsoft.com/zh-tw/library/ms175046.aspx
Microsoft technet https://technet.microsoft.com/library/aa991542
teamshatter sql-injection http://www.teamshatter.com/topics/general/team-shatter-exclusive/sql-injections-in-stored-procedures/
好可怕,一般簡易的或是年久失修的網站隨隨便便個資就能外洩,可見正規化的重要性!感謝分享
Authorization bypass
SQL也可以用 'OR'=#
感謝Pangolin大大的補充唷
Pangolin 也是一個 SQL Injection 的工具說 XDDD
http://www.360doc.com/content/13/0827/12/13655030_310219138.shtml
想請問一下 假設所有參數都已經塞進 SQL語法之中,再去做攻擊判斷 (ex.or、--、exec) 會不會出問題?
還是應該先把參數的特殊字元過濾之後才塞進SQL語法去執行?
建議能先做特殊字元的過濾喔
請問一下你說的三種較常見的 SQL injection 攻擊手法:
1.Authorization Bypass(略過權限檢查)
2.Injecting SQL Sub-Statements into SQL Queries(注入 SQL 子語法)
3.Exploiting Stored Procedures(利用預存程序)
Q1:2和3是不是1要先成功2和3才能使用,還是就算1未成功2和3依然可以使用呢?